// Copyright (C) 2015 André Bargull. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
description: IdentityEscape for Unicode RegExp
info: |
    IdentityEscape for Unicode RegExps is restricted to SyntaxCharacter and U+002F (SOLIDUS)
es6id: 21.1.2
---*/

// 21.2.1 Patterns
//
// IdentityEscape[U] ::
//   [+U] SyntaxCharacter
//   [+U] /
//
// SyntaxCharacter :: one of
//   ^ $ \ . * + ? ( ) [ ] { } |

// IdentityEscape in AtomEscape
function Test() {
    assert(/\^/u.test("^"), "IdentityEscape in AtomEscape: /\\^/");
    assert(/\$/u.test("$"), "IdentityEscape in AtomEscape: /\\$/");
    assert(/\\/u.test("\\"), "IdentityEscape in AtomEscape: /\\\\/");
    assert(/\./u.test("."), "IdentityEscape in AtomEscape: /\\./");
    assert(/\*/u.test("*"), "IdentityEscape in AtomEscape: /\\*/");
    assert(/\+/u.test("+"), "IdentityEscape in AtomEscape: /\\+/");
    assert(/\?/u.test("?"), "IdentityEscape in AtomEscape: /\\?/");
    assert(/\(/u.test("("), "IdentityEscape in AtomEscape: /\\(/");
    assert(/\)/u.test(")"), "IdentityEscape in AtomEscape: /\\)/");
    assert(/\[/u.test("["), "IdentityEscape in AtomEscape: /\\[/");
    assert(/\]/u.test("]"), "IdentityEscape in AtomEscape: /\\]/");
    assert(/\{/u.test("{"), "IdentityEscape in AtomEscape: /\\{/");
    assert(/\}/u.test("}"), "IdentityEscape in AtomEscape: /\\}/");
    assert(/\|/u.test("|"), "IdentityEscape in AtomEscape: /\\|/");
    assert(/\//u.test("/"), "IdentityEscape in AtomEscape: /\\//");


// IdentityEscape in ClassEscape
    assert(/[\^]/u.test("^"), "IdentityEscape in ClassEscape: /[\\^]/");
    assert(/[\$]/u.test("$"), "IdentityEscape in ClassEscape: /[\\$]/");
    assert(/[\\]/u.test("\\"), "IdentityEscape in ClassEscape: /[\\\\]/");
    assert(/[\.]/u.test("."), "IdentityEscape in ClassEscape: /[\\.]/");
    assert(/[\*]/u.test("*"), "IdentityEscape in ClassEscape: /[\\*]/");
    assert(/[\+]/u.test("+"), "IdentityEscape in ClassEscape: /[\\+]/");
    assert(/[\?]/u.test("?"), "IdentityEscape in ClassEscape: /[\\?]/");
    assert(/[\(]/u.test("("), "IdentityEscape in ClassEscape: /[\\(]/");
    assert(/[\)]/u.test(")"), "IdentityEscape in ClassEscape: /[\\)]/");
    assert(/[\[]/u.test("["), "IdentityEscape in ClassEscape: /[\\[]/");
    assert(/[\]]/u.test("]"), "IdentityEscape in ClassEscape: /[\\]]/");
    assert(/[\{]/u.test("{"), "IdentityEscape in ClassEscape: /[\\{]/");
    assert(/[\}]/u.test("}"), "IdentityEscape in ClassEscape: /[\\}]/");
    assert(/[\|]/u.test("|"), "IdentityEscape in ClassEscape: /[\\|]/");
    assert(/[\/]/u.test("/"), "IdentityEscape in ClassEscape: /[\\/]/");
}

// preheat
const NUMBER_OF_PREHEAT = 1;
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}

ArkTools.jitCompileAsync(Test);
assert.sameValue(ArkTools.waitJitCompileFinish(Test), true, '[JIT] JIT disabled.');

// test
const NUMBER_OF_TEST = 1; // or 2
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}
